Модуларна аритметика
Кажемо да је број r остатак при дељењу броја x бројем y и пишемо xmody=r ако и само ако постоји број q такав да је x=q⋅y+r и 0≤r<y. Поред тога што са mod означавамо бинарну операцију, mod се може користити и као ознака бинарне релације у скупу целих бројева. Наиме, писаћемо a≡bmodm ако m|(a−b). Ово је еквивалентно томе да a и b дају исти остатак при дељењу са m. На пример, пишемо 12≡2mod5 јер 5|(12−2).
Релацију mod користимо у неким свакодневним ситуацијама, а да тога често нисмо ни свесни.
Један од таквих примера је рад са временом. Наиме, за 15 сати након 11 часова рећи ћемо да је 2 сата (што одговара томе да је 11+15≡2mod24).
Слично важи и за дане у недељи, које рачунамо по модулу 7. Ако је данас, рецимо, четвртак и интересује нас који ће дан бити за сто дана, не морамо да бројимо један по један дан. Сваком дану можемо придружити неки остатак при дељењу са 7 (0 - понедељак, 1 - уторак, 2 - среда, 3 - четвртак, 4 - петак, 5 - субота, 7 - недеља), а затим израчунати (3+100)mod7=5 и знаћемо да је за 100 дана субота (проћи ће 14 пуних недеља тј. 98 дана и биће поново четвртак, након 99 дана ће бити петак, а након 100 субота). Аналогно се рачуна и месец или редни број недеље у години.
Слично важи и приликом рада са угловима (које рачунамо по модулу 360 степени).
Модуларна аритметика има пуно практичних примена: користи се за израчунавање контролних сума за међународне стандардне идентификаторе књига (ISBN бројеве) и идентификаторе банки (IBAN). Модуларна аритметика је и у основи савремених криптографских система.
Бројеви се у рачунарима представљају по модулу 2k. На пример, у
језику C++ бројеви типа unsigned int
представљају се по
модулу 232.
На пример, у језику C# бројеви типа
uint
представљају се по модулу 232. У наредном
коду резултат квадрирања броја 123456789 биће вредност 1234567892mod32=2537071545.
unsigned int x = 123456789;
cout << x*x << endl;
Сабирање и множење по модулу
Уколико је потребно одредити вредност збира или производа бројева по модулу m од помоћи нам могу бити наредне релације:
(a+b)modm=(amodm + bmodm)modm
(a⋅b)modm=(amodm ⋅ bmodm)modm
Доказ коректности. за доказивање, па је остављамо за вежбу). Претпоставимо да је a=qa⋅m+ra и b=qb⋅m+rb за 0≤ra,rb<m. Тада важи да је a⋅b = (qa⋅m+ra)⋅(qb⋅m+rb) = (qa⋅qb⋅m+qa⋅rb+ra⋅qb)m+ra⋅rb. Ако важи да је ra⋅rb=q⋅m+r за 0≤r<m, тада је са a⋅b=(qa⋅qb⋅m+qa⋅rb+ra⋅qb+q)m+r, па је (a⋅b)modm=r. Са друге стране, важи да је (amodm ⋅ bmod m)modm=(ra⋅rb)modm=r, чиме је тврђење доказано.
Одузимање по модулу
Размотримо проблем одређивања разлике бројева b и a по модулу m. На пример, потребно је одредити
вредност (b−a)modm.
Желели бисмо да као вредност овог израза добијемо ненегативну вредност
чак и у случају када је b<a.
Међутим, не постоји сагласност између различитих програмских језика у
рачунању вредности x % m
када је x
негативно.
Наиме, у језику C++ и у језику C# бисмо за вредност остатка добили
негативан број: вредност израза (2 - 7) % 3
била би
-2
, док би у језику Python као резутат добили позитиван
број 1
. Уместо да вршимо испитивање да ли је дељеник
негативан, ако је 0≤a,b<m, позитиван резултат је могуће добити израчунавањем вредности
израза (b−a+m)modm. Додавањем вредности m, вредност b−a+m ће постати сигурно ненегативна (јер разлика b−a не може бити мања од −m), а тражење остатка ће практично
поништити првобитно додавање вредности m). У претходном смо се ослонили на
чињеницу да су и a и b бројеви који су већи или једнаки од
0 и строго мањи од m. Проналажење вредности разлике по
модулу m могуће је и у општем
случају и важи
(B−A)modm=(Bmodm−Amodm+m)modm
Доказ коректности. Докажимо ово тврђење. Подсетимо се да је xmody=r ако и само ако постоји q такав да је x=q⋅y+r и ако је 0≤r<y. Нека је A=qa⋅m+a и B=qb⋅m+b, за 0≤a,b<m. Зато је Amodm=a и Bmodm=b. Нека је B−A+m=p⋅m+r за неко 0≤r<m. Зато је (Bmodm−Amodm+m)modm=(b−a+m)modm=r. Такође, важи и да је B−A=(qb−qa)⋅m+(b−a)=(qb−qa−1)⋅m+(b−a+m)=(qb−qa−1+p)⋅m+r, па је и (B−A)modm=r, чиме је тврђење доказано.
Степеновање по модулу
Као последица множења по модулу, важи и наредно тврђење, које омогућава да се израчуна степен по модулу:
anmodm=(amodm)nmodm
Модуларна аритметика
Кажемо да је број r остатак при дељењу броја x бројем y и пишемо xmody=r ако и само ако постоји број q такав да је x=q⋅y+r и 0≤r<y. Поред тога што са mod означавамо бинарну операцију, mod се може користити и као ознака бинарне релације у скупу целих бројева. Наиме, писаћемо a≡bmodm ако m|(a−b). Ово је еквивалентно томе да a и b дају исти остатак при дељењу са m. На пример, пишемо 12≡2mod5 јер 5|(12−2).
Релацију mod користимо у неким свакодневним ситуацијама, а да тога често нисмо ни свесни.
Један од таквих примера је рад са временом. Наиме, за 15 сати након 11 часова рећи ћемо да је 2 сата (што одговара томе да је 11+15≡2mod24).
Слично важи и за дане у недељи, које рачунамо по модулу 7. Ако је данас, рецимо, четвртак и интересује нас који ће дан бити за сто дана, не морамо да бројимо један по један дан. Сваком дану можемо придружити неки остатак при дељењу са 7 (0 - понедељак, 1 - уторак, 2 - среда, 3 - четвртак, 4 - петак, 5 - субота, 7 - недеља), а затим израчунати (3+100)mod7=5 и знаћемо да је за 100 дана субота (проћи ће 14 пуних недеља тј. 98 дана и биће поново четвртак, након 99 дана ће бити петак, а након 100 субота). Аналогно се рачуна и месец или редни број недеље у години.
Слично важи и приликом рада са угловима (које рачунамо по модулу 360 степени).
Модуларна аритметика има пуно практичних примена: користи се за израчунавање контролних сума за међународне стандардне идентификаторе књига (ISBN бројеве) и идентификаторе банки (IBAN). Модуларна аритметика је и у основи савремених криптографских система.
Бројеви се у рачунарима представљају по модулу 2k. У наредном коду резултат квадрирања броја 123456789 биће вредност 1234567892mod32=2537071545.
unsigned int x = 123456789;
cout << x*x << endl;
Сабирање и множење по модулу
Уколико је потребно одредити вредност збира или производа бројева по модулу m од помоћи нам могу бити наредне релације:
(a+b)modm=(amodm + bmodm)modm
(a⋅b)modm=(amodm ⋅ bmodm)modm
Доказ коректности. за доказивање, па је остављамо за вежбу). Претпоставимо да је a=qa⋅m+ra и b=qb⋅m+rb за 0≤ra,rb<m. Тада важи да је a⋅b = (qa⋅m+ra)⋅(qb⋅m+rb) = (qa⋅qb⋅m+qa⋅rb+ra⋅qb)m+ra⋅rb. Ако важи да је ra⋅rb=q⋅m+r за 0≤r<m, тада је са a⋅b=(qa⋅qb⋅m+qa⋅rb+ra⋅qb+q)m+r, па је (a⋅b)modm=r. Са друге стране, важи да је (amodm ⋅ bmod m)modm=(ra⋅rb)modm=r, чиме је тврђење доказано.
Одузимање по модулу
Размотримо проблем одређивања разлике бројева b и a по модулу m. На пример, потребно је одредити
вредност (b−a)modm.
Желели бисмо да као вредност овог израза добијемо ненегативну вредност
чак и у случају када је b<a.
Међутим, не постоји сагласност између различитих програмских језика у
рачунању вредности x % m
када је x
негативно.
Наиме, у језику C++ и у језику C# бисмо за вредност остатка добили
негативан број: вредност израза (2 - 7) % 3
била би
-2
, док би у језику Python као резутат добили позитиван
број 1
. Уместо да вршимо испитивање да ли је дељеник
негативан, ако је 0≤a,b<m, позитиван резултат је могуће добити израчунавањем вредности
израза (b−a+m)modm. Додавањем вредности m, вредност b−a+m ће постати сигурно ненегативна (јер разлика b−a не може бити мања од −m), а тражење остатка ће практично
поништити првобитно додавање вредности m). У претходном смо се ослонили на
чињеницу да су и a и b бројеви који су већи или једнаки од
0 и строго мањи од m. Проналажење вредности разлике по
модулу m могуће је и у општем
случају и важи
(B−A)modm=(Bmodm−Amodm+m)modm
Доказ коректности. Докажимо ово тврђење. Подсетимо се да је xmody=r ако и само ако постоји q такав да је x=q⋅y+r и ако је 0≤r<y. Нека је A=qa⋅m+a и B=qb⋅m+b, за 0≤a,b<m. Зато је Amodm=a и Bmodm=b. Нека је B−A+m=p⋅m+r за неко 0≤r<m. Зато је (Bmodm−Amodm+m)modm=(b−a+m)modm=r. Такође, важи и да је B−A=(qb−qa)⋅m+(b−a)=(qb−qa−1)⋅m+(b−a+m)=(qb−qa−1+p)⋅m+r, па је и (B−A)modm=r, чиме је тврђење доказано.
Степеновање по модулу
Као последица множења по модулу, важи и наредно тврђење, које омогућава да се израчуна степен по модулу:
anmodm=(amodm)nmodm